package main

import (
	"flag"
	"fmt"
	"gitee.com/liyunyi/tour/internal/word"
	"log"
)

func main() {
	//1.1:flag基本使用和长短选项
	//flag_example01()
	//1.2:flag子命令的使用
	//flag_example02()

	// 2.1:测试下划线单词转为大写驼峰
	upperCamelCase := word.UnderscoreToUpperCamelCase("user_name")
	fmt.Println("word:", upperCamelCase)
	// 2.2:测试下划线单词转为小写驼峰
	lowerCamelCase := word.UnderscoreToLowerCamelCase("user_name")
	fmt.Println("word:", lowerCamelCase)
	// 2.3:测试驼峰转下划线单词
	underscore := word.CamelCaseToUnderscore("userName")
	fmt.Println("word:", underscore)
}

// 1.2:flag子命令的实现
// example: go run main.go go -name=golang
// example: go run main.go php -n=php
/*
	flag.NewFlagSet 方法的第二个参数是 ErrorHandling，用于指定处理异常错误的情况处理，其内置提供以下三种模式：
		const (
			// 返回错误描述
			ContinueOnError ErrorHandling = iota
			// 调用 os.Exit(2) 退出程序
			ExitOnError
			// 调用 panic 语句抛出错误异常
			PanicOnError
		)
*/
func flag_example02() {
	var name string

	flag.Parse()
	args := flag.Args()
	// go run main.go go --name=golang -name=gogogo
	// args:[go --name=golang -name=gogogo], len=3, args[1:]=[--name=golang -name=gogogo]
	fmt.Printf("args:%v,len=%d,args[1:]=%v\n", args, len(args), args[1:])

	if len(args) <= 0 {
		return
	}

	switch args[0] {
	case "go":
		goCmd := flag.NewFlagSet("go", flag.ExitOnError)
		goCmd.StringVar(&name, "name", "Go 语言", "帮助信息")
		_ = goCmd.Parse(args[1:])
	case "php":
		phpCmd := flag.NewFlagSet("php", flag.ExitOnError)
		phpCmd.StringVar(&name, "n", "PHP 语言", "帮助信息")
		_ = phpCmd.Parse(args[1:])
	}

	log.Printf("name: %s", name)
}

// 1.1:flag基本使用和长短选项
// example: go run main.go -name=golang
// example: go run main.go -n=golang
func flag_example01() {
	var name string
	flag.StringVar(&name, "name", "Go 语言编程之旅", "帮助信息")
	flag.StringVar(&name, "n", "Go 语言编程之旅", "帮助信息")
	flag.Parse()
	log.Printf("name: %s", name)
}
